package com.southminority.ethnic.service.member;

import com.southminority.ethnic.controller.member.vo.MemberVO;
import com.southminority.ethnic.pojo.Member;

import java.util.List;

/**
 * 团队成员服务接口.
 * <p>
 * 定义了团队成员模块的核心业务逻辑，包括前端展示和后台管理的所有功能。
 *
 * @author SouthMinority
 */
public interface MemberService {

    // =================================================================================
    // ==                             前端展示相关方法 (Public API)                     ==
    // =================================================================================

    /**
     * 获取所有已启用的团队成员列表（用于前端展示）。
     * <p>
     * 结果会根据 `sort_order` 字段升序排列, `sort_order` 相同则按创建时间降序排列.
     *
     * @return {@link List<MemberVO>} 团队成员视图对象列表.
     */
    List<MemberVO> getAllMembers();

    /**
     * 按组织过滤的团队成员列表（用于前端展示）。
     * @param organizationId 归属机构ID，可为空；为空时等价于 getAllMembers。
     * @return 成员列表
     */
    List<MemberVO> getAllMembersByOrganization(Long organizationId);

    /**
     * 根据ID获取单个团队成员的详细信息（用于前端详情页）。
     *
     * @param id 团队成员的唯一标识ID.
     * @return {@link MemberVO} 包含完整信息的团队成员视图对象.
     */
    MemberVO getMemberDetail(Long id);

    /**
     * 获取所有不重复的部门列表（用于前端筛选菜单）。
     *
     * @return {@link List<String>} 部门名称字符串列表.
     */
    List<String> getDepartments();

    /**
     * 获取所有不重复的职称列表（用于前端筛选菜单）。
     *
     * @return {@link List<String>} 职称名称字符串列表.
     */
    List<String> getTitles();


    // =================================================================================
    // ==                             后台管理相关方法 (Admin API)                      ==
    // =================================================================================
    
    com.southminority.ethnic.common.result.PageResult<MemberVO> getMemberPageForAdmin(
            Integer page, Integer size, String name, String department, String title, Integer status
    );
   
    /**
     * 后台分页（带机构筛选）
     */
    com.southminority.ethnic.common.result.PageResult<MemberVO> getMemberPageForAdmin(
            Integer page, Integer size, String name, String department, String title, Integer status, Long organizationId
    );

    MemberVO createMember(Member member);

    MemberVO updateMember(Long id, Member member);

    boolean deleteMember(Long id);

    boolean batchDeleteMembers(List<Long> ids);

    boolean updateMemberStatus(Long id, Integer status);

    MemberVO getMemberDetailForAdmin(Long id);
}
